<?php

class Roles_Model_Seccionfuncional extends Model_Cna {
	
	private function quitar_acentos($cadena){
		$cadena = ereg_replace("[äáàâãª]","a",$cadena);
		$cadena = ereg_replace("[ÄÁÀÂÃÄ]","A",$cadena);
		$cadena = ereg_replace("[ÏÍÌÎ]","I",$cadena);
		$cadena = ereg_replace("[ïíìî]","i",$cadena);
		$cadena = ereg_replace("[ëéèê]","e",$cadena);
		$cadena = ereg_replace("[ËÉÈÊ]","E",$cadena);
		$cadena = ereg_replace("[öóòôõº]","o",$cadena);
		$cadena = ereg_replace("[ÖÓÒÔÕ]","O",$cadena);
		$cadena = ereg_replace("[üúùû]","u",$cadena);
		$cadena = ereg_replace("[ÜÚÙÛ]","U",$cadena);
		$cadena = str_replace("ç","c",$cadena);
		$cadena = str_replace("Ç","C",$cadena);
		$cadena = ereg_replace("[ñ]","n",$cadena);
		$cadena = ereg_replace("[Ñ]","N",$cadena);
		
		return $cadena;
	}
	
	private function quitar_acentos_letras($cadena){
		$cadena = str_replace("&aacute;","a",$cadena);
		$cadena = str_replace("&eacute;","e",$cadena);
		$cadena = str_replace("&iacute;","i",$cadena);
		$cadena = str_replace("&oacute;","o",$cadena);
		$cadena = str_replace("&uacute;","u",$cadena);
		$cadena = str_replace("&ntilde;","n",$cadena);
		$cadena = str_replace("\""," ",$cadena);
		return $cadena;
	}
	
	/**
	 * Devuelve el xml para visualizarlo en el arbol de funcionalidades
	 * @return String
	 */
	public function getXmlFuncionalidades($cod_rol,$cod_seccion,$cod_padre_perfil,&$doc) {
		$seccionfuncionalTable = new Roles_Model_DbTable_Seccionfuncional();
		$resultados = $seccionfuncionalTable->getSelectFetchAll($cod_seccion,$cod_padre_perfil);
		foreach($resultados as $row){
			$cod_seccion 	= $row['codseccion'];
//			$nombre 		= $this->quitar_acentos($this->quitar_acentos_letras($row['nombre']));
			$nombre 		= $row['nombre'];
			$cod_padre 		= $row['codpadre'];
			
			$perfilrolTable = new Roles_Model_DbTable_Perfilrol();
			$resultados_seccion = $perfilrolTable->getArregloSeccionPerfil($cod_rol);
			$arr_seccion_perfil = array();
			foreach($resultados_seccion as $rows){
				$arr_seccion_perfil[] 	= $rows['codseccion'];
			}
			//Zend_Debug::dump($arr_seccion_perfil);
			
			$chequeado = "";
			if (!empty($cod_rol)){
				if (in_array($cod_seccion,$arr_seccion_perfil)) {
					$chequeado = " checked=\"1\"";
				}
			}
			//echo $seccionfuncionalTable->tiene_hijos($cod_seccion);
			
			if ($seccionfuncionalTable->tiene_hijos($cod_seccion)){
				$doc.="<item text=\"{$nombre}\" id=\"{$cod_seccion}\">\n";//papis
				$this->getXmlFuncionalidades($cod_rol,$cod_seccion,$cod_padre_perfil,$doc);
				$doc.="</item>\n";
			}else{
				$doc.="<input type=\"text\" name=\"\" id=\"\" value=\"\" />";
				$doc.="<item text=\"{$nombre}\" id=\"{$cod_seccion}\" {$chequeado}/>\n";
			}
			
		}
	}
	
	public function arregloPadres($codigo,&$arr_codpadres){
		$seccionfuncionalTable = new Roles_Model_DbTable_Seccionfuncional();
		$resultados = $seccionfuncionalTable->consultaPadres($codigo);
		foreach($resultados as $row){
			$cod_padre=$row["codpadre"];
			if (!empty($cod_padre)){
				$arr_codpadres[] = $cod_padre;
				$this->arregloPadres($cod_padre,$arr_codpadres);
			}
		}
	}
	
	/**
	 * Genera el perfil de permisos para un usuario y rol especificos.
	 * @param int $codusuario
	 * @param int $codrol
	 * @return App_Perfil
	 */
	public function generarPerfil($codusuario, $codrol) {
		$sfTable = new Roles_Model_DbTable_Seccionfuncional();
		
		$funcRol = array();
		foreach ($sfTable->getFuncionalidadesPorRol($codrol) as $key => $value) {
			$codseccion = $value["codseccion"];
			$funcRol[$codseccion] = $value;
		}
		
		$funcUsu = array();
		foreach ($sfTable->getFuncionalidadesPorUsuario($codusuario) as $key => $value) {
			$codseccion = $value["codseccion"];
			$funcUsu[$codseccion] = $value;
		}
		
		$acciones=array("ver"=>4,"crear"=>5,"modificar"=>6,"eliminar"=>7);
		foreach ($funcUsu as $key => $arr) {
			if(array_key_exists($key,$funcRol)) {
				foreach ($acciones as $value => $index) {
					if ($funcRol[$key][$value] == 'N' && $funcUsu[$key][$value] == 'S') {
						$funcRol[$key][$value] = 'S';
						$funcRol[$key][$index] = 'S';
					}
				}
			}
			else {
				$funcRol[$key] = $arr;
			}
		}
		
		$perfil = new App_Perfil($funcRol);
		
		$artp = $sfTable->obtenerSeccionesPadre($perfil->perfiles_cargados_id());
		$perfil->registrar_padres($artp);
		return $perfil;
	}
	/**
	 * Genera un arreglo asociativo con llave codseccion y valor arreglo asociativo de permisos
	 * $permisosFuncionalidadesPorRol[codseccion]=array("ver"=>valorver,"crear"=>valorcrear,"modificar"=>valormodificar,"eliminar"=>valoreliminar)
	 * @param int $codrol
	 * @return array $permisosFuncionalidadesPorRol
	 */
	private function getPermisosFuncionalidadesPorRol($codrol){
		$sfTable = new Roles_Model_DbTable_Seccionfuncional();
		$permisosFuncionalidadesPorRol=array();
		$funcionalidadesPorRol=$sfTable->getFuncionalidadesPorRol($codrol);
		for($i=0;$i<count($funcionalidadesPorRol);$i++){
			$codseccion	= $funcionalidadesPorRol[$i]["codseccion"];
			$ver="";$crear="";$modificar="";$eliminar="";
			$ver		= $funcionalidadesPorRol[$i]["ver"];
			$crear		= $funcionalidadesPorRol[$i]["crear"];
			$modificar	= $funcionalidadesPorRol[$i]["modificar"];
			$eliminar	= $funcionalidadesPorRol[$i]["eliminar"];
			$permisosFuncionalidadesPorRol[$codseccion]=array(  "ver"=>$ver,
																"crear"=>$crear,
																"modificar"=>$modificar,
																"eliminar"=>$eliminar
																);
		}
		return $permisosFuncionalidadesPorRol;
	}
	
	/**
	 * Obtiene los Componentes (Funcionalidades) filtrados por rol.
	 * @param int $codrol
	 * @return Array $FuncionalidadesComponentesPorRol
	 */
	private function getFuncionalidadesComponentesPorRol($codrol){
		$sfTable = new Roles_Model_DbTable_Seccionfuncional();
		$FuncionalidadesComponentesPorRol=array();
		$funcionalidadesComponentesPorRol=$sfTable->getFuncionalidadesComponentesPorRol($codrol);
		for($i=0;$i<count($funcionalidadesComponentesPorRol);$i++){
			$codseccion	= $funcionalidadesComponentesPorRol[$i]["codseccion"];
			$FuncionalidadesComponentesPorRol[$codseccion]	= $funcionalidadesComponentesPorRol[$i]["nombre"];
		}
		return $FuncionalidadesComponentesPorRol;
	}
	
	public function asignacionFuncionalidadesRol($codrol){
		//front controller
		$frontController = Zend_Controller_Front::getInstance ();
		$baseUrl=$frontController->getBaseUrl();
		
		$sfTable = new Roles_Model_DbTable_Seccionfuncional();
		
		$permisosFuncionalidadesPorRol=$this->getPermisosFuncionalidadesPorRol($codrol);
		$funcionalidadesComponentesPorRol=$this->getFuncionalidadesComponentesPorRol($codrol);
		
		$html="";
		$acciones = array("ver","crear","modificar","eliminar");
		foreach ($funcionalidadesComponentesPorRol as $codseccion => $nombre){
			$html.="<tr><td colspan=\"5\"><b>{$nombre}</b></td></tr>\n";
			$funcionalidadesOpcionesPorRol=$sfTable->getFuncionalidadesComponentesPorRol($codrol,$codseccion);
			for($i=0;$i<count($funcionalidadesOpcionesPorRol);$i++){
				$icon  = "text_menu.gif";
				$title = "Visible en menú";
				$url   = $funcionalidadesOpcionesPorRol[$i]["url"];
				$codseccionOpcionesPorRol=$funcionalidadesOpcionesPorRol[$i]["codseccion"];
				if(trim($url)==""){
					$icon="spacer.gif";
					$title="";
				}
				
				$html.="<tr>";
				$html.="<td align=\"left\" style=\"background: #F5F5F5\"><img src=\"".$baseUrl.'/img/'.$icon."\" title=\"{$title}\" width=\"16\" height=\"16\"> {$funcionalidadesOpcionesPorRol[$i]["nombre"]}</td>\n";
				foreach ($acciones as $acci) {
					$sombra = ($permisosFuncionalidadesPorRol[$codseccionOpcionesPorRol][$acci]=="S")?" style=\"background: #E9E2BE;text-align:center;\"":" style=\"text-align:center;\"";
					$html.="<td{$sombra}>";
					$selected = ($funcionalidadesOpcionesPorRol[$i][$acci]=="S")?" checked":"";
					$html.="<input type=\"checkbox\" name=\"{$acci}_{$funcionalidadesOpcionesPorRol[$i]["codseccion"]}\" value=\"1\"{$selected}>";
					$html.="</td>\n";
				}
				$html.="</tr>";
				
				$funcionalidadesOpcionesPorRol2=$sfTable->getFuncionalidadesComponentesPorRol($codrol,$codseccionOpcionesPorRol);
				for($j=0;$j<count($funcionalidadesOpcionesPorRol2);$j++){
					$icon  = "text_menu.gif";
					$title = "Visible en menú";
					$url   = $funcionalidadesOpcionesPorRol2[$j]["url"];
					$codseccionOpcionesPorRol2=$funcionalidadesOpcionesPorRol2[$j]["codseccion"];
					if(trim($url)==""){
						$icon="spacer.gif";
						$title="";
					}
					
					$html.="<tr>";
					$html.="<td align=\"left\" style=\"background: #F5F5F5\"><img src=\"".$baseUrl.'/img/'.$icon."\" title=\"{$title}\" width=\"16\" height=\"16\"> {$funcionalidadesOpcionesPorRol2[$j]["nombre"]}</td>\n";
					foreach ($acciones as $acci) {
						$sombra = ($permisosFuncionalidadesPorRol[$codseccionOpcionesPorRol2][$acci]=="S")?" style=\"background: #E9E2BE;text-align:center;\"":" style=\"text-align:center;\"";
						$html.="<td{$sombra}>";
						$selected = ($funcionalidadesOpcionesPorRol2[$j][$acci]=="S")?" checked":"";
						$html.="<input type=\"checkbox\" name=\"{$acci}_{$funcionalidadesOpcionesPorRol2[$j]["codseccion"]}\" value=\"1\"{$selected}>";
						$html.="</td>\n";
					}
					$html.="</tr>";
				}
				$html.="</tr>";
			}
		}
		return $html;
	}
	
	/**
	 * Obtiene las Opciones (Funcionalidades) filtrados por rol.
	 * @param int $codrol
	 * @return Array $FuncionalidadesOpcionesPorRol
	 */
	public function getFuncionalidadesOpcionesPorRol($codrol){
		$sfTable = new Roles_Model_DbTable_Seccionfuncional();
		$FuncionalidadesOpcionesPorRol=array();
		$funcionalidadesOpcionesPorRol=$sfTable->getFuncionalidadesComponentesPorRol($codrol,"IS NOT NULL");
		for($i=0;$i<count($funcionalidadesOpcionesPorRol);$i++){
			$codseccion	= $funcionalidadesOpcionesPorRol[$i]["codseccion"];
			$FuncionalidadesOpcionesPorRol[$i]	= $codseccion;
		}
		return $FuncionalidadesOpcionesPorRol;
	}
	
	public function getArreglo($codrol){
		//$sfTable = new Roles_Model_DbTable_Seccionfuncional();
		//return $sfTable->getFuncionalidadesPorRol($codrol);
		//return $this->getPermisosFuncionalidadesPorRol($codrol);
		$sfTable = new Roles_Model_DbTable_Seccionfuncional();
		return $sfTable->getFuncionalidadesComponentesPorRol($codrol);
	}
	
	/**
	 * Genera un arreglo asociativo con llave codseccion y valor arreglo asociativo de permisos
	 * $permisosFuncionalidadesPorRol[codseccion]=array("ver"=>valorver,"crear"=>valorcrear,"modificar"=>valormodificar,"eliminar"=>valoreliminar)
	 * @param int $codrol
	 * @param int $codusuario
	 * @return array $permisosFuncionalidadesPorRol
	 */
	private function getPermisosFuncionalidadesPorRolyUsuario($codrol,$codusuario){
		$sfTable = new Roles_Model_DbTable_Seccionfuncional();
		$permisosFuncionalidadesPorRol=array();
		$funcionalidadesPorRol=$sfTable->getFuncionalidadesPorRolyUsuario($codrol,$codusuario);
		for($i=0;$i<count($funcionalidadesPorRol);$i++){
			$codseccion	= $funcionalidadesPorRol[$i]["codseccion"];
			$ver="";$crear="";$modificar="";$eliminar="";
			$ver		= $funcionalidadesPorRol[$i]["ver"];
			$crear		= $funcionalidadesPorRol[$i]["crear"];
			$modificar	= $funcionalidadesPorRol[$i]["modificar"];
			$eliminar	= $funcionalidadesPorRol[$i]["eliminar"];
			$permisosFuncionalidadesPorRol[$codseccion]=array(  "ver"=>$ver,
																"crear"=>$crear,
																"modificar"=>$modificar,
																"eliminar"=>$eliminar
																);
		}
		return $permisosFuncionalidadesPorRol;
	}
	
	/**
	 * Obtiene los Componentes (Funcionalidades) filtrados por rol.
	 * @param int $codrol
	 * @return Array $FuncionalidadesComponentesPorRol
	 */
	private function getFuncionalidadesComponentesPorRolyUsuario($codusuario){
		$sfTable = new Roles_Model_DbTable_Seccionfuncional();
		$FuncionalidadesComponentesPorRol=array();
		$funcionalidadesComponentesPorRol=$sfTable->getFuncionalidadesComponentesPorRolyUsuario($codusuario);
		for($i=0;$i<count($funcionalidadesComponentesPorRol);$i++){
			$codseccion	= $funcionalidadesComponentesPorRol[$i]["codseccion"];
			$FuncionalidadesComponentesPorRol[$codseccion]	= $funcionalidadesComponentesPorRol[$i]["nombre"];
		}
		return $FuncionalidadesComponentesPorRol;
	}
	
    public function asignacionFuncionalidadesUsuario($codrol,$codusuario){
		//front controller
		$frontController = Zend_Controller_Front::getInstance ();
		$baseUrl=$frontController->getBaseUrl();
		
		$sfTable = new Roles_Model_DbTable_Seccionfuncional();
		
		$permisosFuncionalidadesPorRol=$this->getPermisosFuncionalidadesPorRolyUsuario($codrol,$codusuario);
		//$funcionalidadesComponentesPorRol=$this->getFuncionalidadesComponentesPorRolyUsuario($codusuario);
		$funcionalidadesComponentesPorRol=$this->getFuncionalidadesComponentesPorRol($codrol);
		//Zend_Debug::dump($permisosFuncionalidadesPorRol);
		//Zend_Debug::dump($funcionalidadesComponentesPorRol);
		$html="";
		$acciones = array("ver","crear","modificar","eliminar");
		foreach ($funcionalidadesComponentesPorRol as $codseccion => $nombre){
			$html.="<tr>
					<td><b>{$nombre}</b></td>
					<td></td>
					<td></td>
					<td></td>
					<td></td>
					</tr>\n";
			$funcionalidadesOpcionesPorRol=$sfTable->getFuncionalidadesComponentesPorRolyUsuario($codusuario,$codseccion);
			for($i=0;$i<count($funcionalidadesOpcionesPorRol);$i++){
				$icon  = "text_menu.gif";
				$title = "Visible en menú";
				$url   = $funcionalidadesOpcionesPorRol[$i]["url"];
				$codseccionOpcionesPorRol=$funcionalidadesOpcionesPorRol[$i]["codseccion"];
				if(trim($url)==""){
					$icon="spacer.gif";
					$title="";
				}
				
				$html.="<tr>";
				$html.="<td align=\"left\" style=\"background: #F5F5F5\"><img src=\"".$baseUrl.'/img/'.$icon."\" title=\"{$title}\" width=\"16\" height=\"16\"> {$funcionalidadesOpcionesPorRol[$i]["nombre"]}</td>\n";
				foreach ($acciones as $acci) {
					$sombra = " style=\"text-align:center;\"";
					if(array_key_exists($codseccionOpcionesPorRol,$permisosFuncionalidadesPorRol)){
				        $sombra = ($permisosFuncionalidadesPorRol[$codseccionOpcionesPorRol][$acci]=="S")?" style=\"background: #E9E2BE;text-align:center;\"":" style=\"text-align:center;\"";
					}
				    $html.="<td{$sombra}>";
					$selected = ($funcionalidadesOpcionesPorRol[$i][$acci]=="S")?" checked":"";
					$html.="<input type=\"checkbox\" name=\"{$acci}_{$funcionalidadesOpcionesPorRol[$i]["codseccion"]}\" value=\"1\"{$selected}>";
					$html.="</td>\n";
				}
				$html.="</tr>";
				
				$funcionalidadesOpcionesPorRol2=$sfTable->getFuncionalidadesComponentesPorRolyUsuario($codusuario,$codseccionOpcionesPorRol);
				for($j=0;$j<count($funcionalidadesOpcionesPorRol2);$j++){
					$icon  = "text_menu.gif";
					$title = "Visible en menú";
					$url   = $funcionalidadesOpcionesPorRol2[$j]["url"];
					$codseccionOpcionesPorRol2=$funcionalidadesOpcionesPorRol2[$j]["codseccion"];
					if(trim($url)==""){
						$icon="spacer.gif";
						$title="";
					}
					
					$html.="<tr>";
					$html.="<td align=\"left\" style=\"background: #F5F5F5\"><img src=\"".$baseUrl.'/img/'.$icon."\" title=\"{$title}\" width=\"16\" height=\"16\"> {$funcionalidadesOpcionesPorRol2[$j]["nombre"]}</td>\n";
					foreach ($acciones as $acci) {
						$sombra = ($permisosFuncionalidadesPorRol[$codseccionOpcionesPorRol2][$acci]=="S")?" style=\"background: #E9E2BE;text-align:center;\"":" style=\"text-align:center;\"";
						$html.="<td{$sombra}>";
						$selected = ($funcionalidadesOpcionesPorRol2[$j][$acci]=="S")?" checked":"";
						$html.="<input type=\"checkbox\" name=\"{$acci}_{$funcionalidadesOpcionesPorRol2[$j]["codseccion"]}\" value=\"1\"{$selected}>";
						$html.="</td>\n";
					}
					$html.="</tr>";
				}
				$html.="</tr>";
			}
		}
		return $html;
	}
	
}//fin de la clase